chore: upgrade to react native 81 and expo 54 - #6875
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughUpgrades RN/Expo and Android/iOS tooling, migrates Reanimated bridge calls from runOnJS to scheduleOnRN, replaces several touchables with RectButton/Touch, switches many expo-file-system imports to expo-file-system/legacy, and applies multiple manifest, plist, Gradle, and Xcode project updates. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes 🚥 Pre-merge checks | ✅ 2 | ❌ 3❌ Failed checks (1 warning, 2 inconclusive)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Android Build Available Rocket.Chat Experimental 4.71.0.108439 Internal App Sharing: https://play.google.com/apps/test/RQVpXLytHNc/ahAO29uNSuEVKKA0DG3IPkOnoI1S2XrUNX2nUQvp_K0WPo95OnUZaT-J6ggoaqE-ep8RKRmAVkXlFF4ijR5vrlbvFE |
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
app/views/ShareListView/index.tsx (1)
105-117:⚠️ Potential issue | 🟠 MajorFilter out null attachments before setting state.
Line 106returnsnullfor missing files, butLine 117force-casts the array toIFileToShare[]. This can propagatenullintoattachmentsand break downstream consumers expecting only attachment objects.💡 Proposed fix
- const attachments = info.map(file => { - if (!file.exists) { - return null; - } - - return { - filename: decodeURIComponent(file.uri.substring(file.uri.lastIndexOf('/') + 1)), - description: '', - size: file.size, - mime: mime.lookup(file.uri), - path: file.uri - }; - }) as IFileToShare[]; + const attachments = info + .map(file => { + if (!file.exists) { + return null; + } + return { + filename: decodeURIComponent(file.uri.substring(file.uri.lastIndexOf('/') + 1)), + description: '', + size: file.size ?? 0, + mime: mime.lookup(file.uri), + path: file.uri + }; + }) + .filter((file): file is IFileToShare => file !== null);🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/views/ShareListView/index.tsx` around lines 105 - 117, The attachments mapping in ShareListView (const attachments = info.map(... ) as IFileToShare[]) returns null for missing files but is force-cast, so filter out nulls before setting state: replace the single-step map+cast with map producing nullable items and then filter to remove nulls (e.g., .filter(Boolean) or a type guard like .filter((a): a is IFileToShare => a !== null)) so attachments is a true IFileToShare[] and downstream consumers won’t receive null values.
♻️ Duplicate comments (1)
app/containers/UIKit/Overflow.tsx (1)
44-57:⚠️ Potential issue | 🟠 MajorUse an instance-local ref for the popover anchor.
Line 44 introduces a module-scoped ref registry, and Line 49 allows
blockIdto be empty. That combination can retain stale refs and mis-anchorPopover(downstream at Line 72) when keys collide. Prefer a per-instanceuseReftied to component lifecycle.Suggested fix
-import React, { useState } from 'react'; -import { FlatList, StyleSheet, Text, type View } from 'react-native'; +import React, { useRef, useState } from 'react'; +import { FlatList, StyleSheet, Text } from 'react-native'; @@ -const touchable: { [key: string]: React.RefObject<View | null> } = {}; - export const Overflow = ({ element, loading, action, parser }: IOverflow) => { const { theme } = useTheme(); const options = element?.options || []; - const blockId = element?.blockId || ''; const [show, onShow] = useState(false); - - if (!touchable[blockId]) { - touchable[blockId] = React.createRef(); - } - - const touchableRef = touchable[blockId] as React.RefObject<any>; + const touchableRef = useRef<React.ElementRef<typeof Touch>>(null);🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/containers/UIKit/Overflow.tsx` around lines 44 - 57, The module-scoped touchable registry (touchable) can hold stale refs and collide when blockId is empty; replace it with an instance-local ref inside the Overflow component: remove usage of the touchable map and instead create const touchableRef = useRef<View | null>(null) (or useRef<any>(null)) within the Overflow function and use that ref as the Popover anchor; drop the blockId-based allocation logic and any casts to touchableRef so the ref is tied to the component lifecycle and cannot leak or collide across instances.
🧹 Nitpick comments (1)
app/views/RoomView/List/components/List.tsx (1)
27-31: Guard the RN bridge behind a visibility flip.Right now every scroll event above/below
SCROLL_LIMITpostssetVisibleback to the RN runtime.scheduleOnRNalways schedules work onto that runtime, so this adds avoidable cross-runtime traffic on the room list’s hottest path even when the boolean has not changed. Cache the last threshold in a shared value and only bridge on transitions. (docs.swmansion.com)♻️ Proposed fix
-import Animated, { useAnimatedScrollHandler } from 'react-native-reanimated'; +import Animated, { useAnimatedScrollHandler, useSharedValue } from 'react-native-reanimated'; import { scheduleOnRN } from 'react-native-worklets'; @@ const List = ({ listRef, jumpToBottom, ...props }: IListProps) => { const [visible, setVisible] = useState(false); + const visibleRef = useSharedValue(false); const { isAutocompleteVisible } = useRoomContext(); const scrollHandler = useAnimatedScrollHandler({ onScroll: event => { - if (event.contentOffset.y > SCROLL_LIMIT) { - scheduleOnRN(setVisible, true); - } else { - scheduleOnRN(setVisible, false); + const nextVisible = event.contentOffset.y > SCROLL_LIMIT; + if (nextVisible !== visibleRef.value) { + visibleRef.value = nextVisible; + scheduleOnRN(setVisible, nextVisible); } } });🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@app/views/RoomView/List/components/List.tsx` around lines 27 - 31, The onScroll handler is calling scheduleOnRN(setVisible, ...) on every event even when visibility hasn't changed, causing unnecessary RN bridge traffic; add a worklet/shared boolean (e.g., lastVisible shared value) inside the same scope as onScroll and update it in the worklet so you only call scheduleOnRN when the computed visible state (event.contentOffset.y > SCROLL_LIMIT) differs from lastVisible, then flip lastVisible and invoke scheduleOnRN(setVisible, newValue) only on that transition; reference the onScroll handler, scheduleOnRN, setVisible, SCROLL_LIMIT and the new lastVisible shared value when applying the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@app/containers/List/ListItem.tsx`:
- Around line 23-25: The code in ListItem.tsx computes
shouldDisableAccessibility using process.env.RUNNING_E2E_TESTS which bypasses
the React Native typed env import; replace that usage by importing
RUNNING_E2E_TESTS from '@env' and use it (together with isIOS) when computing
shouldDisableAccessibility and any other occurrences (e.g., around line 177).
Update the top-level imports to include RUNNING_E2E_TESTS and ensure the boolean
check uses the typed value instead of process.env to work with the
babel-plugin/react-native-dotenv setup.
In `@app/containers/RoomItem/Actions.tsx`:
- Line 12: Add a Jest mock for the react-native-worklets package in
jest.setup.js so imports like scheduleOnRN from 'react-native-worklets' in files
such as RoomItem/Actions.tsx resolve during tests; specifically, in
jest.setup.js register a jest.mock that maps 'react-native-worklets' to the
package's built-in mock module (the module at
'react-native-worklets/lib/module/mock'), and ensure this mock registration runs
before any test files import scheduleOnRN or other symbols from
'react-native-worklets'.
---
Outside diff comments:
In `@app/views/ShareListView/index.tsx`:
- Around line 105-117: The attachments mapping in ShareListView (const
attachments = info.map(... ) as IFileToShare[]) returns null for missing files
but is force-cast, so filter out nulls before setting state: replace the
single-step map+cast with map producing nullable items and then filter to remove
nulls (e.g., .filter(Boolean) or a type guard like .filter((a): a is
IFileToShare => a !== null)) so attachments is a true IFileToShare[] and
downstream consumers won’t receive null values.
---
Duplicate comments:
In `@app/containers/UIKit/Overflow.tsx`:
- Around line 44-57: The module-scoped touchable registry (touchable) can hold
stale refs and collide when blockId is empty; replace it with an instance-local
ref inside the Overflow component: remove usage of the touchable map and instead
create const touchableRef = useRef<View | null>(null) (or useRef<any>(null))
within the Overflow function and use that ref as the Popover anchor; drop the
blockId-based allocation logic and any casts to touchableRef so the ref is tied
to the component lifecycle and cannot leak or collide across instances.
---
Nitpick comments:
In `@app/views/RoomView/List/components/List.tsx`:
- Around line 27-31: The onScroll handler is calling scheduleOnRN(setVisible,
...) on every event even when visibility hasn't changed, causing unnecessary RN
bridge traffic; add a worklet/shared boolean (e.g., lastVisible shared value)
inside the same scope as onScroll and update it in the worklet so you only call
scheduleOnRN when the computed visible state (event.contentOffset.y >
SCROLL_LIMIT) differs from lastVisible, then flip lastVisible and invoke
scheduleOnRN(setVisible, newValue) only on that transition; reference the
onScroll handler, scheduleOnRN, setVisible, SCROLL_LIMIT and the new lastVisible
shared value when applying the change.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: d3e08d3d-d4e6-4858-9e00-736b3eb47c49
⛔ Files ignored due to path filters (25)
app/containers/Avatar/__snapshots__/Avatar.test.tsx.snapis excluded by!**/*.snapapp/containers/Button/__snapshots__/Button.test.tsx.snapis excluded by!**/*.snapapp/containers/Chip/__snapshots__/Chip.test.tsx.snapis excluded by!**/*.snapapp/containers/DirectoryItem/__snapshots__/DirectoryItem.test.tsx.snapis excluded by!**/*.snapapp/containers/Header/components/HeaderButton/__snapshots__/HeaderButtons.test.tsx.snapis excluded by!**/*.snapapp/containers/InAppNotification/__snapshots__/NotifierComponent.test.tsx.snapis excluded by!**/*.snapapp/containers/List/__snapshots__/List.test.tsx.snapis excluded by!**/*.snapapp/containers/LoginServices/__snapshots__/LoginServices.test.tsx.snapis excluded by!**/*.snapapp/containers/MessageComposer/__snapshots__/MessageComposer.test.tsx.snapis excluded by!**/*.snapapp/containers/ReactionsList/__snapshots__/ReactionsList.test.tsx.snapis excluded by!**/*.snapapp/containers/RoomHeader/__snapshots__/RoomHeader.test.tsx.snapis excluded by!**/*.snapapp/containers/RoomItem/__snapshots__/RoomItem.test.tsx.snapis excluded by!**/*.snapapp/containers/SearchBox/__snapshots__/SearchBox.test.tsx.snapis excluded by!**/*.snapapp/containers/ServerItem/__snapshots__/ServerItem.test.tsx.snapis excluded by!**/*.snapapp/containers/TextInput/__snapshots__/TextInput.test.tsx.snapis excluded by!**/*.snapapp/containers/UIKit/__snapshots__/UiKitMessage.test.tsx.snapis excluded by!**/*.snapapp/containers/UIKit/__snapshots__/UiKitModal.test.tsx.snapis excluded by!**/*.snapapp/containers/markdown/__snapshots__/Markdown.test.tsx.snapis excluded by!**/*.snapapp/containers/message/__snapshots__/Message.test.tsx.snapis excluded by!**/*.snapapp/views/CannedResponsesListView/__snapshots__/CannedResponseItem.test.tsx.snapis excluded by!**/*.snapapp/views/CreateChannelView/RoomSettings/__snapshots__/SwitchItem.test.tsx.snapis excluded by!**/*.snapapp/views/DiscussionsView/__snapshots__/Item.test.tsx.snapis excluded by!**/*.snapapp/views/NewServerView/components/ServersHistoryItem/__snapshots__/ServersHistoryItem.test.tsx.snapis excluded by!**/*.snapapp/views/RoomView/LoadMore/__snapshots__/LoadMore.test.tsx.snapis excluded by!**/*.snapapp/views/ThreadMessagesView/__snapshots__/Item.test.tsx.snapis excluded by!**/*.snap
📒 Files selected for processing (35)
.maestro/tests/accessibilityAndAppearance/ToastsAndDialogs.yml.maestro/tests/assorted/join-from-directory.yaml.maestro/tests/assorted/profile.yaml.maestro/tests/room/room-actions.yamlandroid/app/src/main/java/chat/rocket/reactnative/MainApplication.ktandroid/app/src/main/java/chat/rocket/reactnative/networking/SSLPinningTurboModule.javaapp/containers/ActionSheet/Handle.tsxapp/containers/AudioPlayer/Seek.tsxapp/containers/Button/index.tsxapp/containers/List/ListItem.tsxapp/containers/MessageComposer/components/RecordAudio/RecordAudio.tsxapp/containers/MessageComposer/hooks/useEmojiKeyboard.tsxapp/containers/RoomItem/Actions.tsxapp/containers/RoomItem/Touchable.tsxapp/containers/RoomItem/interfaces.tsapp/containers/ServerItem/SwipeableDeleteItem/Actions.tsxapp/containers/ServerItem/SwipeableDeleteItem/Touchable.tsxapp/containers/UIKit/Overflow.tsxapp/containers/message/Touch.tsxapp/lib/encryption/encryption.tsapp/lib/methods/handleMediaDownload.tsapp/lib/methods/helpers/fileDownload.tsapp/lib/methods/helpers/fileUpload/Upload.android.tsapp/lib/methods/helpers/sslPinning.tsapp/lib/methods/sendFileMessage/utils.tsapp/views/AttachmentView.tsxapp/views/CreateDiscussionView/index.tsxapp/views/DirectoryView/Options.tsxapp/views/RoomView/List/components/List.tsxapp/views/SecurityPrivacyView.tsxapp/views/ShareListView/index.tsxapp/views/ShareView/Thumbs.tsxapp/views/UserNotificationPreferencesView/index.tsxapp/views/UserPreferencesView/index.tsxbabel.config.js
✅ Files skipped from review due to trivial changes (11)
- app/containers/ActionSheet/Handle.tsx
- app/lib/methods/helpers/fileDownload.ts
- .maestro/tests/accessibilityAndAppearance/ToastsAndDialogs.yml
- app/lib/methods/sendFileMessage/utils.ts
- app/lib/methods/helpers/fileUpload/Upload.android.ts
- app/views/AttachmentView.tsx
- android/app/src/main/java/chat/rocket/reactnative/networking/SSLPinningTurboModule.java
- app/views/UserNotificationPreferencesView/index.tsx
- app/containers/MessageComposer/components/RecordAudio/RecordAudio.tsx
- app/lib/encryption/encryption.ts
- app/views/UserPreferencesView/index.tsx
🚧 Files skipped from review as they are similar to previous changes (2)
- babel.config.js
- android/app/src/main/java/chat/rocket/reactnative/MainApplication.kt
📜 Review details
🧰 Additional context used
🧠 Learnings (7)
📓 Common learnings
Learnt from: Rohit3523
Repo: RocketChat/Rocket.Chat.ReactNative PR: 6930
File: package.json:101-101
Timestamp: 2026-02-05T13:55:06.688Z
Learning: The RocketChat/Rocket.Chat.ReactNative repository uses a fork of react-native-image-crop-picker (RocketChat/react-native-image-crop-picker) with custom Android edge-to-edge fixes, not the upstream ivpusic/react-native-image-crop-picker package. Dependencies should reference commit pins from the RocketChat fork.
📚 Learning: 2025-12-17T15:56:22.578Z
Learnt from: OtavioStasiak
Repo: RocketChat/Rocket.Chat.ReactNative PR: 6499
File: app/containers/ServerItem/index.tsx:34-36
Timestamp: 2025-12-17T15:56:22.578Z
Learning: In the Rocket.Chat React Native codebase, for radio button components on iOS, include the selection state ("Selected"/"Unselected") in the accessibilityLabel instead of using accessibilityState={{ checked: hasCheck }}, because iOS VoiceOver has known issues with accessibilityRole="radio" + accessibilityState that prevent correct state announcement.
Applied to files:
app/views/CreateDiscussionView/index.tsxapp/containers/List/ListItem.tsxapp/containers/message/Touch.tsxapp/views/SecurityPrivacyView.tsx
📚 Learning: 2026-03-10T15:21:45.098Z
Learnt from: Rohit3523
Repo: RocketChat/Rocket.Chat.ReactNative PR: 7046
File: app/containers/InAppNotification/NotifierComponent.stories.tsx:46-75
Timestamp: 2026-03-10T15:21:45.098Z
Learning: In `app/containers/InAppNotification/NotifierComponent.tsx` (React Native, Rocket.Chat), `NotifierComponent` is exported as a Redux-connected component via `connect(mapStateToProps)`. The `isMasterDetail` prop is automatically injected from `state.app.isMasterDetail` and does not need to be passed explicitly at call sites or in Storybook stories that use the default (connected) export.
Applied to files:
app/views/ShareListView/index.tsxapp/containers/message/Touch.tsxapp/containers/UIKit/Overflow.tsx
📚 Learning: 2026-03-17T19:15:30.463Z
Learnt from: Rohit3523
Repo: RocketChat/Rocket.Chat.ReactNative PR: 6970
File: .maestro/tests/room/share-message.yaml:77-79
Timestamp: 2026-03-17T19:15:30.463Z
Learning: In `.maestro/tests/room/share-message.yaml` (Rocket.Chat React Native), the `tapOn: point: 5%,10%` step is intentional: it taps the empty area above the bottom sheet and keyboard to dismiss both simultaneously. Using `action-sheet-handle` instead would only close the sheet but not the keyboard. This pattern is acceptable when both need to be dismissed together in a single step.
Applied to files:
.maestro/tests/assorted/profile.yaml
📚 Learning: 2026-03-05T14:28:10.004Z
Learnt from: Rohit3523
Repo: RocketChat/Rocket.Chat.ReactNative PR: 6997
File: .maestro/tests/room/message-markdown-click.yaml:28-39
Timestamp: 2026-03-05T14:28:10.004Z
Learning: In Maestro YAML selector fields (text, id) within the Rocket.Chat React Native repository, use the contains pattern '.*keyword.*' (leading and trailing '.*') for matching text. The pattern '.*keyword*.' is incorrect and will fail to match cases where the keyword appears at the end of the element's text. This guideline applies to all Maestro YAML selector fields across the codebase.
Applied to files:
.maestro/tests/assorted/profile.yaml.maestro/tests/room/room-actions.yaml.maestro/tests/assorted/join-from-directory.yaml
📚 Learning: 2026-03-17T19:15:26.536Z
Learnt from: Rohit3523
Repo: RocketChat/Rocket.Chat.ReactNative PR: 6970
File: .maestro/tests/room/share-message.yaml:77-79
Timestamp: 2026-03-17T19:15:26.536Z
Learning: In YAML test files under .maestro/tests/room, use tapping the empty area (e.g., tapOn: point: 5%,10%) to dismiss both the bottom sheet and keyboard when needed. Do not rely on action-sheet-handle alone if the keyboard also needs to be dismissed in the same step. This pattern is acceptable for tests where a single tap should close both UI elements.
Applied to files:
.maestro/tests/room/room-actions.yaml
📚 Learning: 2026-03-04T20:13:17.288Z
Learnt from: divyanshu-patil
Repo: RocketChat/Rocket.Chat.ReactNative PR: 6957
File: ios/RocketChat Watch App/Views/MessageComposerView.swift:37-55
Timestamp: 2026-03-04T20:13:17.288Z
Learning: In the WatchOS app (ios/RocketChat Watch App) for Rocket.Chat React Native, using SwiftUI `Button` inside a `ScrollView` on WatchOS causes accidental message sends because button tap targets can be triggered during scroll gestures. `Text` with `.onTapGesture` is the preferred pattern for tappable items in scroll views on WatchOS. To preserve accessibility, add `.accessibilityAddTraits(.isButton)` and `.accessibilityLabel()` to the `Text` element instead.
Applied to files:
app/containers/message/Touch.tsxapp/views/SecurityPrivacyView.tsx
🔇 Additional comments (15)
app/containers/Button/index.tsx (2)
91-99: LGTM on the RectButton implementation.The switch from
PressabletoRectButtonwithenabled={!isDisabled}correctly handles the Android production build issue mentioned in the PR. The component properly:
- Derives
isDisabledfromdisabled || loading- Converts to
enabled={!isDisabled}for RectButton's expected API- Preserves all accessibility attributes
3-3: No breaking changes detected. The components using Pressable-specific props likeandroid_ripple(IconButton, UserItem, Chip) are separate implementations that extend Pressable directly, not callers of the Button component. All actual Button imports pass only compatible props (title, type, onPress, loading, etc.), making this migration safe.app/views/ShareListView/index.tsx (1)
5-5: No actionable concern in this import-only change.app/lib/methods/handleMediaDownload.ts (1)
1-1: No actionable concern in this import-only change.app/lib/methods/helpers/sslPinning.ts (2)
3-3: No actionable concern in this import-only change.
64-64: No actionable concern in this typing-only change.app/containers/message/Touch.tsx (1)
10-11: Looks good: platform touchable swap is coherent and props are correctly wired.The Line 30 component selection and Line 81 non-iOS touch props are internally consistent with the rendered wrapper and forwarded ref usage.
Also applies to: 30-31, 81-81
app/views/ShareView/Thumbs.tsx (1)
3-3: LGTM: unified touch wrapper simplifies platform handling without changing intent.The switch to
Touchin Line 96 keeps the thumb press behavior clear while preserving the dedicated remove action button.Also applies to: 11-12, 96-113
app/views/SecurityPrivacyView.tsx (2)
106-112: Carry-forward: crash report accessibility label still points to the wrong state.Line 111 is still bound to
analyticsEventsState; it should usecrashReportStateso the spoken enabled/disabled state matches the crash-report toggle.
96-102: Good move:testIDis now attached to the actual interactiveSwitch.This makes E2E targeting more reliable than attaching the ID on
List.Item.app/views/DirectoryView/Options.tsx (1)
50-50: Good selector hardening with stable IDs.These
testIDs make the filter toggles deterministic for Maestro and reduce text-selector flakiness.Also applies to: 74-74
.maestro/tests/assorted/profile.yaml (1)
99-100: Nice cleanup using shared keyboard-dismiss flow.Centralizing this into
hide-keyboard.yamlshould reduce platform-specific drift in this test.Also applies to: 115-116
app/views/CreateDiscussionView/index.tsx (1)
174-174: LGTM on movingtestIDto the encryptionSwitch.This is the right locator surface for test interactions.
.maestro/tests/assorted/join-from-directory.yaml (1)
100-100: Great switch from text selectors to stableidselectors.This should make the directory filter steps much less brittle.
Also applies to: 103-103, 148-148, 151-151
.maestro/tests/room/room-actions.yaml (1)
124-127: Good robustness improvement in the action-sheet flow.Using
scrollUntilVisiblehere is safer than waiting when the option can be off-screen.
OtavioStasiak
left a comment
There was a problem hiding this comment.
Small changes, please if the CodeRabbit comment don't make sense resolve it.
| <key>bugsnag</key> | ||
| <dict> | ||
| <key>apiKey</key> | ||
| <string>apiKeyValue</string> | ||
| </dict> |
OtavioStasiak
left a comment
There was a problem hiding this comment.
LGTM!
Tests and build are failing, fix it before merge.
|
Android Build Available Rocket.Chat Experimental 4.71.0.108447 Internal App Sharing: https://play.google.com/apps/test/RQVpXLytHNc/ahAO29uNSe0sB2fIYVw7i1b0LaQAonccWz3ay8C8ATpQ-QpC24-QVref215SVoXBymRH8Acraz7ge7PEb6SgEiTxQ2 |
|
Android Build Available Rocket.Chat Experimental 4.72.0.108466 Internal App Sharing: https://play.google.com/apps/test/RQVpXLytHNc/ahAO29uNSoFKhNrbRyysRmed0k_WVbVZ9q7EdwVZ18gg4_HZDHsFcbtEcdJIKfm1UviKGssv7ibx6lJWFQcyYHvIzu |
| const touchable: { [key: string]: React.RefObject<View | null> } = {}; | ||
|
|
||
| export const Overflow = ({ element, loading, action, parser }: IOverflow) => { | ||
| const { theme } = useTheme(); | ||
| const options = element?.options || []; | ||
| const blockId = element?.blockId || ''; | ||
| const [show, onShow] = useState(false); | ||
|
|
||
| if (!touchable[blockId]) { | ||
| touchable[blockId] = React.createRef(); | ||
| } | ||
|
|
||
| const touchableRef = touchable[blockId] as React.RefObject<any>; | ||
|
|
There was a problem hiding this comment.
We need to create an issue for this.
| # Use this property to enable edge-to-edge display support. | ||
| # This allows your app to draw behind system bars for an immersive UI. | ||
| # Note: Only works with ReactActivity and should not be used with custom Activity. | ||
| edgeToEdgeEnabled=false No newline at end of file |
There was a problem hiding this comment.
We'll need to check if this is going to pass on Google Play after merged.
There's a chance they reject us, since it's mandatory now.
Create a subtask on Jira for this so we don't forget.
|
Android Build Available Rocket.Chat 4.72.0.108472 Internal App Sharing: https://play.google.com/apps/test/RQQ8k09hlnQ/ahAO29uNTPmX8EWePB0lh6WbuPc2eBXN2X6XEjjZjtgApTMiE0mHC2XGS7FhRNEwFXSb5I5BlvAYYy0Ng-5MucBotP |
|
Android Build Available Rocket.Chat 4.72.0.108472 |
Proposed changes
This PR updates the React Native version from 0.79 to 0.81.5 and Expo 53 to Expo 54
Few Changes
In expo 54,
expo-file-system/nextwas promoted to stable version with more api changes and current stable version moved toexpo-file-system/legacyIn message component, we are using
TouchableHighlightinstead ofTouchableNativeFeedbackon Android because the ripple effect is currently broken in React Native 0.81 due to major changes in background styling within the library. In message component we can't use component from RNGH because of gesture conflict on iOSIssue Link: [0.80] Using Android ripple on background (default) does not work react/react-native#52939
I tried the use the patch but it is not working
We moved from
PressabletoRectButtonin RNGH because the onPress event was not firing in the production build on Android.Issue link: Pressable doesn't work on android but works on ios and web software-mansion/react-native-gesture-handler#3945
Jest snapshot was failing and it is giving
RangeError: Invalid string lengthand is a known issuereact-isversion but it failedDepends on:
Issue(s)
https://rocketchat.atlassian.net/browse/CORE-1578
Closes #6874
Closes #6803
How to test or reproduce
Screenshots
Types of changes
Checklist
Further comments
Summary by CodeRabbit
New Features
Bug Fixes
Chores
Tests